package com.miniblog.common.utils;

import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.exceptions.JWTCreationException;
import com.auth0.jwt.exceptions.JWTVerificationException;
import com.auth0.jwt.interfaces.Claim;
import com.auth0.jwt.interfaces.DecodedJWT;
import lombok.extern.slf4j.Slf4j;

import java.util.Date;
import java.util.Map;
import java.util.Objects;

/**
 * @path：com.miniblog.common.utils.JwtUtils.java
 * @className：JwtUtils.java
 * @description：jwt token 工具类
 * @author：tanyp
 * @dateTime：2020/1/12 15:16
 * @editNote：
 */
@Slf4j
public class JwtUtils {

    // 密钥
    private static final String SECRET = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9";
    // key id
    private static final String KEYID = "";
    // 过期时间(2小时)
    private static final long EXPIRATION_TIME = 7200000;
    // 使用HS256算法
    private static Algorithm algorithm = Algorithm.HMAC256(SECRET);
    // 自定义key
    private static final String PRIVATE_KEY = "userId";

    /**
     * @methodName：createToken
     * @description：创建token
     * @author：tanyp
     * @dateTime：2020/1/12 15:07
     * @Params： [userId]
     * @Return： java.lang.String
     * @editNote：
     */
    public static String createToken(String userId) {
        try {
            // 创建jwt实例
            return JWT.create().withKeyId(KEYID)
                    // 设置过期时间
                    .withExpiresAt(new Date(System.currentTimeMillis() + EXPIRATION_TIME))
                    // 添加自定义声明
                    .withClaim(PRIVATE_KEY, userId)
                    .sign(algorithm);
        } catch (JWTCreationException e) {
            log.error("JWTUtils --> createToken 异常：{}", e.getMessage());
            return null;
        }
    }

    /**
     * @methodName：verifyToken
     * @description：验证token
     * @author：tanyp
     * @dateTime：2020/1/12 15:09
     * @Params： [token, userId]
     * @Return： java.lang.String
     * @editNote：
     */
    public static String verifyToken(String token) {
        try {
            JWTVerifier verifier = JWT.require(algorithm).build();
            DecodedJWT jwt = verifier.verify(token);
            Map<String, Claim> claims = jwt.getClaims();
            if (!Objects.isNull(claims)) {
                return claims.get(PRIVATE_KEY).asString();
            }
            return null;
        } catch (JWTVerificationException e) {
            log.error("JWTUtils --> verifyToken 异常:{}", e.getMessage());
            return null;
        }
    }

}
